package ocio.services;

import java.io.IOException;
import java.util.Properties;

/**
 * Ofrece el servicio de gestión adecuado para cada clase.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.services.ServiceIF
 */
@SuppressWarnings("all")
public class ServiceLocator {

	Properties properties;
	
	private static ServiceLocator instancia = null;
	
	private ServiceLocator(){
		properties = new Properties(); 
		
		try {
						
			properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("services.properties")); 
             
         } catch (IOException e) {
             e.printStackTrace();
         }
		/*Configurar fichero Properties*/
	}
		
	/**
	 * Devuelve una instancia que será única durante la ejecución del programa
	 * de un localizador de servicios para las clases.
	 * @return instancia Objeto ServiceLocator para la localización de servicios.
	 */
	public synchronized static ServiceLocator getServiceLocator(){
	/*Patron Singleton. Añadir synchronized para evitar problemas con multihilos*/ 
		if (instancia == null) {
			instancia = new ServiceLocator();
		}		
		return instancia;
	}
	
	/**
	 * Devuelve un Objeto de que implenta ServiceIF para una clase dada.
	 * @param s Cadena de texto asociada al nombre cualificado de la clase
	 * en un fichero de properties.
	 * @return service Objeto de la clase qeu implementa ServiceIF 
	 * para clase indicada en el parámetro de entrada.
	 */
	public ServiceIF getService(String s){
		ServiceIF service =null;
		//try{
		try {

			Class clase = (Class) Class.forName(properties.get(s).toString());
			service = (ServiceIF) clase.newInstance();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
 		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		
		return service;
	}
	
	
}
